#ifndef HEAD_H
#define HEAD_H
#include <cpp61th.h>
#include "queue.h"
#define CONFIG_PATH "config.ini"

// 建立结构体对象
typedef struct {
    int thread_num;
    pthread_t *thread_id;
    pthread_cond_t cond;
    pthread_mutex_t lock;
    int exit_flag; // 0表示正常， -1,表示退出
    queue t;
}pool_t;

// 协议头部
typedef struct {
    //枚举的头部信息
    int command;

    //本次发送记录路径的长度
    int path_length;

    //本次发送内容/正文的长度
    int file_length;

    //标记位
    //记录本次发送有几个参数
    int parameter_num;

    //标记位
    //判断是否要发送正文内容
    bool send_flag;

    //标记位
    //用于判断第一次交互时是不是注册行为
    //默认0，1代表本次是注册行为
    bool isRegister;

    //标记位
    //用于标记用户是否登录失败
    //默认0登录成功，1代表登录失败
    bool isLoginFailed;

    bool isDownloadOrUpload;

    //用户uid
    int uid;

    //错误标志
    int error_flag;
    
    //当前层数
    int current_layers;

    //控制信息的字符数组
    char control_msg[1024];
}train_t;

// 线程池初始化
int thread_init(pool_t *pool);

// 线程初始化函数，为每一个子线程初始化mysql连接
int pool_init(pool_t &pool);

// 初始化网络连接
int socket_init(int *socket_fd);

// 初始化epoll,加入监听
int epoll_add_fd(int epoll_fd, int listen_fd);

// 读取配置文件函数
int getParameter(char *key, char *value);

// 注册登录逻辑
// 返回值:0表示正常，-1表示异常
int is_login_or_register(int net_fd, train_t *t,MYSQL *mysql);

// 子线程的入口函数
void *thread_main(void *args);

// 初始化数据库连接
int mysql_real_init(MYSQL *mysql);
#endif
